package com.hsnn.medstgmini.pro.project.service.impl;

import java.sql.Blob;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.hsnn.medstgmini.pro.project.dao.BidContractDao;
import com.hsnn.medstgmini.pro.project.model.BidContract;
import com.hsnn.medstgmini.pro.project.model.BidContractLog;
import com.hsnn.medstgmini.pro.project.model.BidContractParty;
import com.hsnn.medstgmini.pro.project.model.BidContractPartyLog;
import com.hsnn.medstgmini.pro.project.model.BidContractProd;
import com.hsnn.medstgmini.pro.project.model.BidContractProdLog;
import com.hsnn.medstgmini.pro.project.service.BidContractManager;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.Pdf2SwfUtils;

@Service
public class BidContractManagerImpl implements BidContractManager{
	
	@Autowired
	private BidContractDao bidContractDao;
	
	
	@Value("#{sysProp['system.swftoolspath']}")
	private String swftoolspath;//swftoolspath路径
	/**
	 * @category 获取合同列表
	 * @author zhouqi
	 * @date 2015年9月9日15:10:35
	 * @param page
	 * @return Pagination
	 */
	@Override
	public Pagination getContractListPage(Pagination page){
		return bidContractDao.getContractListPage(page);
	}
	

	/**
	 * @category 获取合同日志列表
	 * @author zhouqi
	 * @date 2015年9月9日15:10:35
	 * @param page
	 * @return Pagination
	 */
	@Override
	public Pagination getContractLogListPage(Pagination page){
		return bidContractDao.getContractLogListPage(page);
	}
	
	/**
	 * @category 保存或更新合同
	 * @author zhouqi
	 * @param bidContract
	 * @return void
	 */
	@Override
	public void saveOrUpdateContract(BidContract bidContract){
		bidContractDao.saveOrUpdateContract(bidContract);
	}
	
	/**
	 * @category 保存或更新合同日志
	 * @author zhouqi
	 * @param bidContractLog
	 * @return void
	 */
	@Override
	public void saveOrUpdateContractLog(BidContractLog bidContractLog){
		bidContractDao.saveOrUpdateContractLog(bidContractLog);
	}
	

	/**
	 * @category 根据合同id获取合同
	 * @author zhouqi
	 * @param contractId
	 * @return BidContract
	 */
	@Override
	public BidContract getBidContractById(String contractId){
		return bidContractDao.getBidContractById(contractId);
	}
	
	/**
	 * @category 根据日志id获取合同日志
	 * @param logId
	 * @return
	 */
	@Override
	public BidContractLog getBidContractLogById(String logId){
		return bidContractDao.getBidContractLogById(logId);
	}
	
	/**
	 * @category 保存合同与企业关联关系
	 * @author zhouqi
	 * @date 2015年9月20日14:38:28
	 * @param party
	 */
	public void saveBidContractParty(BidContractParty party){
		 bidContractDao.saveBidContractParty(party);
	}

	/**
	 * @category 保存合同与产品的关联关系
	 * @author zhouqi
	 * @date 2015年9月20日14:38:28
	 * @param party
	 */
	public void saveBidContractProd(BidContractProd prod){
		bidContractDao.saveBidContractProd(prod);
	}
	
	/**
	 * @category 生成pdf和swf
	 * @author zhouqi
	 * @date 2015年9月16日09:25:28
	 * @param contract
	 * @param name
	 * @return void
	 */
	@Override
	public BidContract genePdfAndSwf(BidContract contract, HttpServletRequest request){
		String uuid = UUID.randomUUID().toString();
		String rootPath = request.getSession().getServletContext().getRealPath("/");//获取根路径
		String fontPath = rootPath.replaceAll("\\\\", "/") +"WEB-INF/font/SIMKAI.TTF";//字体路径
		String path = ContractModelManagerImpl.class.getClassLoader().getResource("").getPath();//当前类所在路径
		path = path.replaceAll("\\\\", "/");
		this.geneContractModelPDF(fontPath, contract.getContent(), path+"../../pdffile/"+uuid+".pdf");
		this.geneContractModelSWF(swftoolspath, rootPath+"pdffile/"+uuid+".pdf", rootPath+"swffile/"+uuid+".swf");
		contract.setPdfFilePath("pdffile/"+uuid+".pdf");
		contract.setSwfFilePath("swffile/"+uuid+".swf");
		return contract;
	}
	
	/**
	 * @category 生成PDF版合同
	 * @author zhouqi
	 * @date 2015年9月15日16:28:44
	 * @param content
	 * @param url
	 * @return void
	 */
	public void geneContractModelPDF(String fontPath, String content, String pdfurl) {
		try {
			Pdf2SwfUtils.string2PDF(fontPath, content, pdfurl);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
	/**
	 * @category 生成SWF版合同
	 * @author zhouqi
	 * @date 2015年9月15日16:28:44
	 * @param pdfToosURL pdfToolsURL的安装路径
	 * @param pdfURL pdf的路径
	 * @param swfURL swfURL的路径
	 * @return void
	 */
	public void geneContractModelSWF(String pdfToosURL, String pdfURL, String swfURL) {
		Pdf2SwfUtils.pdf2Swf(pdfToosURL, pdfURL, swfURL);
		
	}
	/**
	 * @category 获取合同code
	 * @author zhouqi
	 * @param void
	 * @return String 
	 */
	@Override
	public String getContractCode(){
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		String time = format.format(new Date());
		String code = "HT"+time;
		return code;
	}
	
	/**
	 * @category 通过合同id获取合同甲方
	 * @author zhouqi
	 * @date 2015年9月20日14:38:28
	 * @param party
	 */
     public List<BidContractParty> getPartyAByContractId(String contractId, Integer isPartyA){
		return bidContractDao.getPartyAByContractId(contractId, isPartyA);
	}

	/**
	 * @category 通过合同id获取合同产品
	 * @author zhouqi
	 * @date 2015年9月20日14:38:28
	 * @param party
	 */
	public List<BidContractProd> getProdByContractId(String contractId){
		return bidContractDao.getProdByContractId(contractId);
	}
	
	/**
	 * @category 保存合同日志文件
	 * @author zhouqi
	 * @date 2015年9月21日22:42:55
	 * @param bidContractLog
	 * @return void
	 */
	public void writeLogOfContract(BidContract bidContract){
		BidContractLog bidContractLog = new BidContractLog();
		BeanUtils.copyProperties(bidContract, bidContractLog);
		bidContractLog.setContractLogId(UUID.randomUUID().toString());
		bidContractDao.saveContractLog(bidContractLog);
	}


	/**
	 * @category 保存合同甲乙方日志
	 * @author zhouqi
	 * @date 2015年9月21日22:42:55
	 * @param bidContractParty
	 * @return void
	 */
	public void writeLogOfContractParty(BidContractParty bidContractParty){
		BidContractPartyLog bidContractPartyLog = new BidContractPartyLog();
		bidContractPartyLog.setLogId(UUID.randomUUID().toString());
		BeanUtils.copyProperties(bidContractParty, bidContractPartyLog);
		bidContractDao.saveConractPartyLog(bidContractPartyLog);
	}

	/**
	 * @category 保存合同药品日志
	 * @author zhouqi
	 * @date 2015年9月21日22:42:55
	 * @param bidContactProd
	 * @return void
	 */
	public void writeLogOfContractDrug(BidContractProd bidContactProd){
		BidContractProdLog contractProdLog = new BidContractProdLog();
		contractProdLog.setLogId(UUID.randomUUID().toString());
		BeanUtils.copyProperties(bidContactProd, contractProdLog);
		bidContractDao.saveContractProdLog(contractProdLog);
	}
	
	/**
	 * @category 获取修改前后对比
	 * @author zhouqi
	 * @date 2015年9月22日14:08:20
	 * @param updDatetime
	 * @return 
	 */
	@Override
	public List<Map<String, Object>>  getCompareLog(String contractId, String updDatetime){
		List<Map<String, Object>> list =  bidContractDao.getCompareLog(contractId, updDatetime);
		return list;
	}


	/**
	 * @category 获取合同的前后对比 
	 * @author zhouqi
	 * @date 2015年9月22日14:08:20
	 * @param updDatetime
	 * @return 
	 */
	@Override
	public List<String> getCompareContractLog(String contractId,
			String updDatetime) {
		List<BidContractLog> bidContractLogList = bidContractDao.getCompareContractLog(contractId, updDatetime);
		List<String> contentList = new ArrayList<String>();
		BidContractLog oldBidContractLog = new BidContractLog();
		BidContractLog newBidContractLog = new BidContractLog();
		 if(bidContractLogList.size()==1){
			oldBidContractLog = bidContractLogList.get(0);
			newBidContractLog = bidContractLogList.get(0);
		}
		if(bidContractLogList.size() > 1){
			oldBidContractLog = bidContractLogList.get(1);
			newBidContractLog = bidContractLogList.get(0);
		}
		Blob oldBlobContnet = oldBidContractLog.getBlobContractContent();
		Blob newBlobContnet = oldBidContractLog.getBlobContractContent();
		try{
			if(null!=newBlobContnet){
				String newContent = new String(newBlobContnet.getBytes((long)1, (int)newBlobContnet.length()),"utf-8");	
				contentList.add(newContent);
			}
			if(null!=oldBlobContnet){
				String oldContent = new String(oldBlobContnet.getBytes((long)1, (int)oldBlobContnet.length()),"utf-8");
				contentList.add(oldContent);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return contentList;	
	}
	
	
	/**
	 * @category 通过合同id获取药品信息
	 * @author zhouqi
	 * @date 2015年10月9日14:10:30
	 * @param contractId
	 * @return List<?>
	 */
	public List<?> getDrugInfoByContractId(String contractId){
		return bidContractDao.getDrugInfoByContractId(contractId);
	}
	
	/**
	 * @category 通过合同id获取药品Id列表
	 * @author zhouqi
	 * @date 2015年10月9日14:10:30
	 * @param contractId
	 * @return List<?>
	 */
	public List<String> getDrugIdsByContractId(String contractId){
		return bidContractDao.getDrugIdsByContractId(contractId);
	}
	
	/**
	 * @category 企业库 信息查询及条件查询
	 * @author zhouqi
	 * @date 2015年10月12日18:49:13
	 * @param stdCompinfo
	 * @return
	 */
	public Pagination queryStdCompinfoList(Pagination page){
		return bidContractDao.queryStdCompinfoList(page);
	}
}
